#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//
//using namespace std;
//const int N = 2e5 + 10;
//int t;
//int q[N];
//int b[N];
//int main()
//{
//    cin >> t;
//    while (t--)
//    {
//        int n, k;
//        int num = 0;
//        cin >> n >> k;
//        int d = 1;
//        while (k--)
//        {
//            d *= 10;
//        }
//
//        for (int i = 1; i <= n; i++)
//            cin >> q[i];
//        b[0] = 1;
//        for (int j = 1; j <= n; j++)
//        {
//            b[j] = q[j] * b[j - 1];
//            int x = b[j];
//            if (x % d == 0 && x / d % 10 != 0) num++;
//
//            else if (x % d % 10 == 0)
//            {
//                b[j - 1] = 1;
//                j--;
//            }
//        }
//        cout << num << endl;
//    }
//
//    return 0;
//}
#include <iostream>

using namespace std;

unsigned long long t;
unsigned long long quimi(int a, int b)
{
    unsigned long long res = 1;
    while (b)
    {
        if (b & 1) res = res * a;
        a *= a;
        b >>= 1;
    }

    return res;
}
int main()
{
    cin >> t;

    while (t--)
    {
        int n, b, p, k;
        cin >> n >> b >> p >> k;
        k = n - k;
        char s[55];
        cin >> s + 1;
        unsigned long long hash = 0;
        for (int i = 1; i <= n; i++)
        {
            hash = (hash * b % p + (s[i] - 'a')) % p;
        }
        int num = 0;

        for (int i = 1; i <= n; i++)
        {
            unsigned long long t = quimi(b, n - i);
                if (num == k)
                    break;
            for(int j = 0;j < 26;j ++)
            if ((hash - s[i] * t  + ('a' + j - 1) * t) % p == hash )
            {
                s[i] = ('a' + j - 1);
                num++;
                break;
            }
        }
        if (num == k) cout << s + 1;
        else  puts("-1");
    }
    return 0;
}